#include "SystemController.h"
#include <iostream>
#include <vector>
#include "Student.h"
#include "InterFace.h"

#define USER_FILE_PATH "../resources/user.txt"
#define STUDENT_FILE_PATH "../resources/student.txt"

using namespace std;

// 构造函数
SystemController::SystemController() : studentManager("admin")
{
    initializeSystem();
}

// 析构函数
// SystemController::~SystemController()
// {
//     // 在这里可以添加清理资源的代码
// }

// 初始化系统
void SystemController::initializeSystem()
{
    // 加载用户数据
    if (!loadUserData())
    {
        cout << "加载用户数据失败！" << endl;
        return;
    }
    // 加载学生数据
    if (!loadStudentData())
    {
        cout << "加载学生数据失败！" << endl;
        return;
    }

    cout << "系统初始化成功！按任意键进入系统..." << endl;
    std::cin.get();
}

// 加载用户数据, 管理员权限
bool SystemController::loadUserData()
{
    std::cout << "正在加载用户数据..." << std::endl;
    bool result = fileHandler.loadUsersFromFile(authManager.getUsers(), USER_FILE_PATH);
    if (result)
    {
        std::cout << "用户数据加载成功！" << std::endl;
    }
    else
    {

        std::cout << "用户数据加载失败！" << std::endl;
    }
    return result;
}
// 保存用户数据, 管理员权限
bool SystemController::saveUserData()
{
    cout << "正在保存用户数据..." << endl;
    bool result = fileHandler.saveUsersToFile(authManager.getUsers(), USER_FILE_PATH);
    if (result)
    {
        cout << "用户数据保存成功！" << endl;
    }
    else
    {
        cout << "用户数据保存失败！" << endl;
    }
    return result;
}

// 加载学生数据, 管理员权限
bool SystemController::loadStudentData()
{
    // 实现加载学生数据的逻辑
    std::cout << "正在加载学生数据..." << std::endl;
    bool result = studentManager.loadFromFile(STUDENT_FILE_PATH);
    if (result)
    {
        std::cout << "学生数据加载成功！" << std::endl;
    }
    else
    {
        std::cout << "学生数据加载失败！" << std::endl;
    }
    return result;
}

// 保存学生数据, 管理员权限
bool SystemController::saveStudentData()
{
    cout << "正在保存学生数据..." << endl;
    bool result = studentManager.saveToFile(STUDENT_FILE_PATH);
    if (result)
    {
        cout << "学生数据保存成功！" << endl;
    }
    else
    {
        cout << "学生数据保存失败！" << endl;
    }
    return result;
}

// 运行系统
void SystemController::run()
{
    // 实现运行系统的逻辑
    bool isRunning = true;
    while (isRunning)
    {
        if (!authManager.isLoggedIn())
        {
            showMainMenu();
        }
        else
        {
            if (currentUserRole == "admin")
            {
                showAdminMenu();
            }
            else
            {
                showUserMenu();
            }
        }
    }
}

// 用户登录
bool SystemController::login()
{
    // 实现用户登录的逻辑
    std::string username, password;

    menuHandler.showLoginMenu(username, password);
    if (authManager.login(username, password))
    {
        currentUsername = username;
        currentUserRole = authManager.getCurrentUserRole();
        cout << "登录成功！欢迎 " << currentUsername << "!" << endl;
        return true;
    }
    else
    {
        cout << "登录失败！用户名或密码错误！" << endl;
        return false;
    }
}

// 用户注册
bool SystemController::registerUser()
{
    // 实现用户注册的逻辑
    string username, password, role;
    showRegisterInterface();
    cout << "请输入新用户名: ";
    getline(cin, username);
    cout << "请输入新密码: ";
    getline(cin, password);
    cout << "请输入用户角色 (user/admin): ";
    getline(cin, role);

    if (authManager.registerUser(username, password, role))
    {
        cout << "注册成功！" << endl;
        // 将新用户保存到文件
        saveUserData();
        return true;
    }
    else
    {
        cout << "注册失败！用户名已存在。" << endl;
        return false;
    }
}

// 显示主菜单
// void SystemController::showMainMenu()
// {
//     // 实现显示主菜单的逻辑
//     showMainInterface();
//     int choice;
//     cout << "请输入您的选择: ";
//     cin >> choice;
//     cin.ignore();

//     switch (choice)
//     {
//     case 1:
//         login();
//         break;
//     case 2:
//         registerUser();
//         break;
//     case 3:
//         exitSystem();
//         break;
//     default:
//         cout << "无效的选择，请重新输入！" << endl;
//     }
// }
void SystemController::showMainMenu()
{
    if (!authManager.isLoggedIn())
    {
        showMainInterface();
        int choice;
        cout << "请输入您的选择: ";
        cin >> choice;
        cin.ignore();

        switch (choice)
        {
        case 1:
            login();
            break;
        case 2:
            registerUser();
            break;
        case 3:
            exitSystem();
            break;
        default:
            cout << "无效的选择，请重新输入！" << endl;
        }
    }
    else
    {
        if (currentUserRole == "admin")
        {
            showAdminMenu();
        }
        else
        {
            showUserMenu();
        }
    }
}

// 显示用户菜单
void SystemController::showUserMenu()
{
    // 实现显示用户菜单的逻辑
    vector<function<void()>> options = {bind(&SystemController::searchStudent, this),
                                        bind(&SystemController::displayAllStudents, this),
                                        bind(&SystemController::exitSystem, this)};
    menuHandler.showMainMenu(currentUserRole, options);
}

// 显示管理员菜单
void SystemController::showAdminMenu()
{
    // 实现显示管理员菜单的逻辑
    vector<function<void()>> options = {bind(&SystemController::addStudent, this),
                                        bind(&SystemController::deleteStudent, this),
                                        bind(&SystemController::updateStudent, this),
                                        bind(&SystemController::searchStudent, this),
                                        bind(&SystemController::displayAllStudents, this),
                                        bind(&SystemController::saveStudentsToFile, this),
                                        bind(&SystemController::exitSystem, this)};
    menuHandler.showMainMenu(currentUserRole, options);
}

// 查询学生信息
void SystemController::searchStudent()
{
    // 实现查询学生信息的逻辑
    int id;
    cout << "请输入要查询的学生学号: ";
    cin >> id;
    cin.ignore();

    Student student;
    if (studentManager.queryStudent(id, student))
    {
        cout << "查询结果：" << endl;
        cout << student << endl;
    }
    else
    {
        cout << "未找到学号为 " << id << " 的学生信息。" << endl;
    }
}

// 显示所有学生信息
void SystemController::displayAllStudents()
{
    // 实现显示所有学生信息的逻辑
    studentManager.displayAllStudents();
}

// 添加学生信息（管理员）
void SystemController::addStudent()
{
    // 实现添加学生信息的逻辑
    if (!studentManager.isAdmin())
    {
        menuHandler.showPermissionDeniedMessage();
        return;
    }

    int id;
    string name;
    float score;
    cout << "请输入新学生的学号: ";
    cin >> id;
    cin.ignore();
    cout << "请输入新学生的姓名: ";
    getline(cin, name);
    cout << "请输入新学生的成绩: ";
    cin >> score;
    cin.ignore();

    Student newStudent(id, name, score);
    if (studentManager.addStudent(newStudent))
    {
        cout << "学生信息添加成功！" << endl;
    }
    else
    {
        cout << "学生信息添加失败！" << endl;
    }
}

// 删除学生信息（管理员）
void SystemController::deleteStudent()
{
    // 实现删除学生信息的逻辑
    if (!studentManager.isAdmin())
    {
        menuHandler.showPermissionDeniedMessage();
        return;
    }

    int id;
    cout << "请输入要删除的学生学号: ";
    cin >> id;
    cin.ignore();

    if (studentManager.deleteStudent(id))
    {
        cout << "学生信息删除成功！" << endl;
    }
    else
    {
        cout << "学生信息删除失败！未找到学号为 " << id << " 的学生。" << endl;
    }
}

// 修改学生信息（管理员）
void SystemController::updateStudent()
{
    // 实现修改学生信息的逻辑
    if (!studentManager.isAdmin())
    {
        menuHandler.showPermissionDeniedMessage();
        return;
    }

    int id;
    string name;
    float score;
    cout << "请输入要修改的学生学号: ";
    cin >> id;
    cin.ignore();
    cout << "请输入新的姓名: ";
    getline(cin, name);
    cout << "请输入新的成绩: ";
    cin >> score;
    cin.ignore();

    if (studentManager.updateStudent(id, name, score))
    {
        cout << "学生信息修改成功！" << endl;
    }
    else
    {
        cout << "学生信息修改失败！未找到学号为 " << id << " 的学生。" << endl;
    }
}

// 保存学生信息到文件（管理员）
void SystemController::saveStudentsToFile()
{
    // 实现保存学生信息到文件的逻辑
    if (!studentManager.isAdmin())
    {
        menuHandler.showPermissionDeniedMessage();
        return;
    }

    saveStudentData();
}

// 退出系统
void SystemController::exitSystem()
{
    // 实现退出系统的逻辑
    if (authManager.isLoggedIn())
    {
        authManager.logout();
        cout << "已退出登录。" << endl;
    }
    else
    {
        cout << "正在退出系统..." << endl;
        // 保存学生数据和用户数据
        saveStudentData();
        saveUserData();
        cout << "感谢使用学生信息管理系统！" << endl;
        exit(0);
    }
}
